﻿using AutoMapper;
using ExcellentProjectPlus.Dominio.Seguridad.Entidades;
using ExcellentProjectPlus.Dominio.Seguridades.Entidades;
using ExcellentProjectPlus.Seguridades.Estudiantes;
using Servicios.Seguridad.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Description;
using System.Web.Http.Results;

namespace Servicios.Seguridad.Controllers
{
    public class EstudiantesController : ApiController
    {
        #region Propiedades       
        IServicioDeGestionDeEstudiantes _servicioDeGestionDeEstudiantes;
        #endregion

        #region Constructores
        public EstudiantesController(IServicioDeGestionDeEstudiantes servicioDeGestionDeEstudiantes)
        {
            _servicioDeGestionDeEstudiantes = servicioDeGestionDeEstudiantes;
            Mapper.CreateMap<Estudiante, EstudianteModel>();
        }
        #endregion

        public IHttpActionResult Get()
        {
            return Ok(Mapper.Map<IEnumerable<Estudiante>, IEnumerable<EstudianteModel>>
                (_servicioDeGestionDeEstudiantes.ObtenerEstudiantes()));
        }


        [ResponseType(typeof(EstudianteModel))]
        [Route("~/api/estudiantes/{id}")]
        public IHttpActionResult GetEstudiante(int id)
        {
            Estudiante estudiante = _servicioDeGestionDeEstudiantes.ObtenerEstudiantePorId(id);
            if (estudiante == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Estudiante, EstudianteModel>(estudiante));
        }

        [Route("~/api/estudiantes/obtenerpornombre/{usuario}")]
        [ResponseType(typeof(EstudianteModel))]
        public IHttpActionResult GetDatosEstudiante(string usuario)
        {
            Estudiante estudiante = _servicioDeGestionDeEstudiantes.ObtenerEstudiantePorNombreUsuario(usuario);
            if (estudiante == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Estudiante, EstudianteModel>(estudiante));
        }


        [ResponseType(typeof(List<InformacionEstudiante>))]
        [Route("~/api/estudiantes/")]
        public IHttpActionResult GetEstudiantes()
        {
            return Ok(_servicioDeGestionDeEstudiantes.ObtenerInformacionEstudiantes());
        }

        [ResponseType(typeof(EstudianteModel))]
        [Route("~/api/estudiantes/{id}/representante")]
        public IHttpActionResult GetRepresentante(int id)
        {
            return Ok(Mapper.Map<Persona, PersonaModel>
                (_servicioDeGestionDeEstudiantes.ObtenerRepresentanteDeEstudiante(id)));
        }

        [ResponseType(typeof(Estudiante))]
        [Route("~/api/estudiantes/")]
        public async Task<IHttpActionResult> Post(Estudiante estudiante)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDeEstudiantes.AgregarEstudiante(estudiante);

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(System.Web.Hosting.HostingEnvironment.MapPath("~"));
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


                var gizmo = new RegisterBindingModel()
                {
                    Email = estudiante.Correo,
                    UserName = estudiante.Usuario,
                    RoleName = "Estudiante",
                    PhoneNumber = estudiante.Telefono,
                    Password = "P@ssword1234",
                    ConfirmPassword = "P@ssword1234"
                };
                var response = await client.PostAsJsonAsync("api/account/register", gizmo);
                if (!response.IsSuccessStatusCode)
                {
                    return InternalServerError(new Exception("Problemas al registrar el usuario"));
                }

            }

            return CreatedAtRoute("DefaultApi", new { controller = "estudiantes", id = estudiante.Id }, estudiante);

        }

        [HttpPut]
        [Route("~/api/estudiantes/{id}")]
        public IHttpActionResult Put(int id, Estudiante estudiante)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != estudiante.Id)
            {
                return BadRequest();
            }

            _servicioDeGestionDeEstudiantes.ModificarEstudiante(estudiante);

            return StatusCode(HttpStatusCode.NoContent);
        }


        [ResponseType(typeof(Estudiante))]
        [Route("~/api/estudiantes/{id}")]
        [HttpDelete]
        public IHttpActionResult DeleteEstudiante(int id)
        {
            Estudiante estudiante = _servicioDeGestionDeEstudiantes.ObtenerEstudiantePorId(id);
            if (estudiante == null)
            {
                return NotFound();
            }

            _servicioDeGestionDeEstudiantes.EliminarEstudiante(estudiante);

            return Ok(estudiante);
        }

        private bool PersonaExists(int id)
        {
            return _servicioDeGestionDeEstudiantes.ObtenerEstudiantePorId(id) != null;
        }
    }
}
